/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package util;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ArchivoTxt {
    
    private Path path;
    
    public ArchivoTxt(){
  
    }

    public ArchivoTxt(String path){
        File file = new File(path);
        if (!file.exists()){
            try {
                file.getParentFile().mkdirs();
                file.createNewFile();
            } catch (IOException ex) {
                Logger.getLogger(ArchivoTxt.class.getName()).log(Level.SEVERE, "no se pudo crear el archivo", ex);
            }
        }
        
        this.path = file.toPath();
    }
    
    public static boolean existe(String path){
        File file = new File(path);
        return file.exists();
    }

    public Path getPath() {
        return path;
    }

    public void setPath(Path path) {
        this.path = path;
    }
        
    /**Agrega las lineas al final del archivo
     * 
     * @param lineas 
     */
    public void append(Collection<String> lineas) {
        try {
            Files.write(path, lineas, Charset.forName("UTF-8"), StandardOpenOption.APPEND);
        } catch (IOException ex) {
            Logger.getLogger(ArchivoTxt.class.getName()).log(Level.SEVERE, "Error escribiendo archivo", ex);
        }
    }
    
    /**Agrega la cadena al final del archivo
     * 
     * @param cadena 
     */
    public void append(String cadena) {
        ArrayList<String> cad = new ArrayList<>();
        cad.add(cadena);
        append(cad);
    }
    
    /**Elimina la linea pasada como parametro
     * 
     * @param linea la linea a eliminar
     */
    public void eliminarLinea(String linea){
        List lineas = leer();
        if (lineas.remove(linea)) {
            pisar(lineas);
        }
    }
    
    /** Elimina todas las lineas indicadas por <code>lineas</code>
     * 
     * @param lineas las lineas a eliminar
     */
    public void eliminarLineas(Collection lineas){
        List lineasArch = leer();
        if (lineasArch.removeAll(lineas)) {
            pisar(lineasArch);
        }
    }

    /** Sobreescribe el archivo con las lineas
     * 
     * @param lineas 
     */
    public void pisar(Collection lineas) {
        try {
            Files.write(path, lineas, Charset.forName("UTF-8"), StandardOpenOption.TRUNCATE_EXISTING);
        } catch (IOException ex) {
            Logger.getLogger(ArchivoTxt.class.getName()).log(Level.SEVERE, "Error en reescribiendo archivo", ex);
        }
    }
    
    /**Elimina las lineas que contienen el patron
     * 
     * @param patron 
     */
    public void eliminarLineaConPatron(String patron){
        List lineasArch = leer();
        ArrayList lineas = new ArrayList();
        Iterator<String> i = lineasArch.iterator();
        while (i.hasNext()) {
            String linea = i.next();
            if (linea.contains(patron)){
                lineas.add(linea);
            }
        }
        if (lineasArch.removeAll(lineas)) {
            pisar(lineasArch);
        }
    }

    /**Devuelve las lineas del archivo como una lista de strings
     * 
     * @return 
     */
    public List<String> leer(){
        try {
            return Files.readAllLines(path, Charset.forName("UTF-8"));
        } catch (IOException ex) {
            Logger.getLogger(ArchivoTxt.class.getName()).log(Level.SEVERE, "Error en lectura de archivo", ex);
            return null;
        }
    }
}
